//数组中只出现一次的数（其它数出现k次）
/*给定一个长度为 n 的整型数组 arr 和一个整数 k(k>1) 。
已知 arr 中只有 1 个数出现一次，其他的数都出现 k 次。
请返回只出现了 1 次的数。
*/
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param arr int整型vector
     * @param k int整型
     * @return int整型
     */
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        int res = 0;
        for (int i = 0; i < 32; i++) {
            int count = 0;
            for (auto& num : arr) {
                if (num & (1 << i))
                    count++;
            }
            if (count % k != 0)
                res = res | (1 << i);
        }
        return res;
    }
};


// 数组中只出现一次的数（其它数出现k次）
/*颠倒给定的 32 位无符号整数的二进制位。

提示：

请注意，在某些语言（如 Java）中，没有无符号整数类型。在这种情况下，输入和输出都将被指定为有符号整数类型，并且不应影响您的实现，因为无论整数是有符号的还是无符号的，其内部的二进制表示形式都是相同的。
在 Java 中，编译器使用二进制补码记法来表示有符号整数。因此，在 示例 2 中，输入表示有符号整数 -3，输出表示有符号整数 -1073741825。
*/
//颠倒二进制位
/*颠倒给定的 32 位无符号整数的二进制位。

提示：

请注意，在某些语言（如 Java）中，没有无符号整数类型。在这种情况下，输入和输出都将被指定为有符号整数类型，并且不应影响您的实现，因为无论整数是有符号的还是无符号的，其内部的二进制表示形式都是相同的。
在 Java 中，编译器使用二进制补码记法来表示有符号整数。因此，在 示例 2 中，输入表示有符号整数 -3，输出表示有符号整数 -1073741825。
*/
class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t ret = 0;
        for (int i = 0; i < 32 && n > 0; i++) {
            ret |= (n & 1) << (31 - i);
            n >>= 1;
        }
        return ret;
    }
};